package net;

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * TCP 网络通信编程 服务端
 * (字节流)
 */
public class SocketTCP01Server {

    public static void main(String[] args) throws Exception {
        /*
            TCP 网络通信编程是基于客户端-服务端的网络通信
            底层使用的是TCP\IP协议
            应用场景：客户端发送数据，服务端接收并显示在控制台
            基于Socket的TCP编程

            例：
            (使用字节流)
            1.编写一个服务端，和一个客户端
            2.服务器端在9999端口监听
            3.客户端连接到服务器端，发送 “hello,server”，然后退出
            4.服务器端接收到客户端发送的信息，输出并退出


            TCP编程客户端(发起连接)：
            1.连接服务端(ip 端口)
            2.连接上后，生成Socket，通过Socket.getOutputStream()
            3.通过输入流，写入数据到数据通道

            TCP编程服务端(接受请求连接(监听))
            1.在本机的9999端口监听，等待连接
            2.当没有客户端连接9999端口时，程序会阻塞，等待连接
            3.通过socket.getInputStream()读取客户端写入到数据通道的数据，显示
         */

        //1.要求在本机没有其他服务占用/监听 9999 端口
        //一个serverSocket可以包含多个socket，可以实现和多个客户端的连接
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端，在9999端口，等待连接....");

        //2.如果有客户端连接，则会返回一个socket对象，程序继续
        Socket socket = serverSocket.accept();
        System.out.println("服务器端socket = " + socket.getClass());

        //3.通过socket.getInputStream() 读取客户端写入到数据通道的数据，显示
        InputStream inputStream = socket.getInputStream();

        //4.IO读取
        byte[] buf = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(buf)) != -1) {
            System.out.println(new String(buf, 0, len));    //根据读取到的实际长度显示内容
        }

        inputStream.close();
        socket.close();
    }
}
